
# 可变参数
"""
1. 概念 ： 通过定义为可变参数时，传入的参数数量就是可变的
2. 分类 ：列表形式的可变参数  ， 字典形式的可变参数 。
3. 列表形式的可变参数 ：
    (1). 定义 ： 在参数名前面加一个* ，传值的时候进来就变为一个元组 。
    (2). 传值 ：可以以位置参数传递 ，也可以以列表或元组的形式参数，前提是必须在列表或元组前加* .

4. 字典形式的可变参数
    (1). 定义 ： 在参数名前加两个** ,传值的时候进来就变为一个字典 。
    (2). 传值 ： 可以是以关键字形式传递 ，也可以以字典形式传递，前提是必须在字典前加**  。
"""


# 需求 ： 加法的操作 ，用户可以随便传任意个值
def add(x,y,*args):
    print("args:",args)
    z = x + y + sum(args)
    return z


# 需求 ： 加法的操作 ，用户可以随便传任意个值
def add1(a,b,**kwargs):
    print("kwargs:",kwargs)
    z = 0
    for x in kwargs.values():
        z += x
    z += a +b
    return z


print("当前的模块名是:{}".format(__name__))

if __name__ == '__main__':
    # 调用
    print(add(3, 4))
    print(add(3, 4, 5))
    print(add(3, 4, 5, 6))
    print(add(3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 1112))  # 以位置参数传递

    # 以列表或元组的形式 。
    print(add(3, 4, *[5, 6, 2, 1, 8]))  # 前面加*代表传递的是列表里面的值
    print(add(3, 4, *(5, 6, 2, 1, 8)))  # 前面加*代表传递的是列表里面的值

    print("=" * 50)

    print(add1(3, 4))
    print(add1(3, 4, c=5))
    print(add1(3, 4, c=5, d=6, x=7, y=9))  # 以关键字传递

    print(add1(3, 4, **{'c': 5, 'd': 6, 'x': 7, 'y': 9}))  # 以字典形式传递
